home *** CD-ROM | disk | FTP | other *** search
/ MacGames Sampler / PHT MacGames Bundle.iso / MacSource Folder / Samples from the CD / C and C++ / sesame C ƒ / Sort.c < prev    next >
C/C++ Source or Header  |  1986-12-11  |  4KB  |  167 lines

  1. /*   SIMPLE C TEST PROGRAM to sort a file */
  2.  
  3. /* This sample program sorts the contents of 1 file into another. */
  4. /* I make the usual apologies about programming style. */
  5. /* It shows how to write a more standard C program that is to say */
  6. /* a non-Macintosh like program.  It also shows the use of printf */
  7. /* for output */
  8.  
  9. /* The setup stuff for a Mac program is invisible.  It is invoked by */
  10. /* loading C-ROOT first, which then loads main().  It defines a basic */
  11. /* Mac environment for these straightforward C programs */
  12. #include stdio.h
  13.  
  14. #define linesize 80
  15. #define linemax linesize-1     /* assume max line size of 80 characters */
  16.  
  17. main()
  18.  
  19. /* we don't have multi-dimensional arrays so we fake it with */
  20. /* simple arrays.  We declare an array of 10000 and then use */
  21. /* it in clumps of 100, in effect making an array of 100 100 byte groups */
  22.  
  23. { int   in,volin,out,volout,numline,lptr,lineno[100],curline,sortpos;
  24.   char  infile[64],line[10000],outfile[64];
  25.   
  26. volin=getfile(infile);
  27. volout=putfile(infile,"Output filename?",outfile);
  28. openw(infile);
  29. events();
  30. in=0;
  31. out=0;
  32.  
  33. in=open(infile,volin,1);   /* these are some mac compatible open */
  34.                            /* routines,  you can also use fopen */
  35. out=open(outfile,volout,2);
  36. settype(outfile,volout,"TEXT");  /* special mac requirement for file types */
  37.     {
  38.      lptr=0;
  39.      printf("%s","First Read in the File...\n");
  40.      while(1) /*read in the file*/
  41.        {
  42.         if(readln(in,&line[lptr]))break;
  43.         lptr=lptr+100;
  44.         if(lptr==10000)
  45.           {
  46.           lptr=lptr-100;
  47.           printf("%s","Sorry, can't sort more than 100 lines...\n");
  48.           break;
  49.           }
  50.        }
  51.      numline=lptr/100;
  52.      lineno[0]=0;
  53.      printf("%s","Next Sort It...\n");
  54.      for(curline=1;curline<=numline;curline++)
  55.         {
  56.         sortpos=0;
  57.         while(sortpos<curline)
  58.            {
  59.            if(lower(&line[curline*100],&line[lineno[sortpos]*100]))break;
  60.            sortpos=sortpos+1;
  61.            }
  62.          push(curline,sortpos,lineno);
  63.         }
  64.      printf("%s","Finally Write It to the Screen and File\n");
  65.      for(curline=0;curline<=numline;curline++)
  66.          writeln(out,&line[lineno[curline]*100]);
  67.  
  68.     }
  69. printf("%s","All Done!!!\n");
  70. close(in);
  71. close(out);
  72. printf("%s","Press any key to end program");
  73. wait();
  74. closew();
  75. }
  76.  
  77. readln(unit,line)
  78.    int   unit;
  79.    char  line[];
  80. {
  81.    int charpos;
  82.    char k;
  83.  
  84.    if (unit==0)return 1;
  85.    charpos=0;
  86.    while((k=getc(unit))>0)
  87.       {
  88.       if((k=='\n')|(charpos>=linemax))break;
  89.       line[charpos++]=k;
  90.       }
  91.    line[charpos]=NULL;  /*append null*/
  92.    if(k<=0)return 1;
  93.    else return 0;
  94.  
  95. }
  96.  
  97.     
  98.  
  99. outbyte(unit,c)
  100.        int  unit;
  101.        char c;
  102.  
  103. {
  104.  if(c==0)return 0;
  105.  putc(c,unit);
  106.  return c;
  107. }
  108.  
  109.  
  110.  
  111. writeln(unit,line)
  112.     int  unit;
  113.     char line[];
  114.   {
  115.     int k;
  116.  
  117.     k=0;
  118.     printf("%-79s %c",line,'\n');   /* yes, we do have prinf and scanf too */
  119.     while(outbyte(unit,line[k++]));
  120.     putc('\n',unit);
  121.  }
  122.  
  123. outdec(n)
  124. int n;
  125. {
  126.        if(n<0)
  127.                putchar('-');
  128.        else    n = -n;
  129.        outint(n);
  130. }
  131.  
  132. outint(n)     
  133. int n;
  134. {      int q;
  135.  
  136.        q = n/10;
  137.        if(q) outint(q);
  138.        putchar('0'-(n-q*10));
  139. }
  140.  
  141. push(curline,sortpos,lineno)
  142.     int   curline,sortpos,lineno[];
  143. {
  144.     int   k;
  145.     for(k=curline;k>sortpos;k--)lineno[k]=lineno[k-1];
  146.     lineno[sortpos]=curline;
  147.        
  148. }
  149.  
  150. lower(str1,str2)
  151.    char   str1[],str2[];
  152.  
  153. {
  154.    int    charpos;
  155.    
  156.    charpos=0;
  157.    if(str1[0]==NULL)return 1; /* if null line it is the lowest */
  158.    while((str1[charpos]!=NULL)&(str2[charpos]!=NULL))
  159.       {
  160.       if(str1[charpos]!=str2[charpos])
  161.         if(str1[charpos]<str2[charpos])return 1;
  162.         else return 0;
  163.       charpos++;
  164.       }
  165.    return 0;
  166. }
  167.